// 封装axios
import axios from 'axios';
import { ElMessage  } from 'element-plus';
import 'element-plus/theme-chalk/el-message.css'
import { useUserStore } from '@/stores/user'

// 在js文件中路由跳转无法使用useRouter产生的router对象，需要使用setup函数中的router对象
// 因此需要导入router文件夹下创建的router实例对象
import router from '@/router'

// 用户信息仓库
const userStore = useUserStore()



// 创建axios实例
const request = axios.create({
    baseURL: 'http://pcapi-xiaotuxian-front-devtest.itheima.net', // 设置请求的基础URL
    timeout: 5000, // 设置请求超时时间
})

// 请求拦截器

/**
 * // 请求拦截器 -> interceptors.request.use（） 函数参数为两个回调函数
 * 第一个回调函数为请求发起前回调，参数为整个请求配置 -> 在函数中必须将参数返回
 * 第二个回调函数为请求错误回导函数，参数为请求错误对象 -> 在函数中可将参数返回，否则得不到错误信息
 */

request.interceptors.request.use(config => {
    // 处理请求前配置
    const { token } = userStore.userInfo
    // 请求拦截器携带token
    if (token ) {
        config.headers.Authorization = `Bearer ${token}`
    }
    
    return config; // 必须返回的请求配置 ，否则请求无法发送成功
}, error => {
    // 处理请求错误

    return Promise.reject(error); // 返回请求错误信息
})

// 响应拦截器
/**
 * 响应拦截器 -> interceptors.response.use() 函数参数为两个回调函数
 * 第一个回调函数为请求响应回到函数，参数为请求响应数据 -> 在函数中必须将参数返回
 * 第二个回到函数为请求失败回调函数，参数为错误对象 -> 在函数中可将参数返回，否则得不到错误信息
 */
request.interceptors.response.use(response => {
    // 处理响应数据

    return response.data; // 返回响应数据 :必须返回。否则请求无法得到数据
}, error => {
        // 处理响应错误

    // token失效401错误处理
    if (error.response && error.response.status === 401) {
        // 提示用戶
        ElMessage.warning('登录状态已过期，请重新登录')
        // 清除用户信息
        userStore.clearUserInfo()
        // 跳转到登录页面
        router.push('/login')
        return 
        
    }

        ElMessage.error(error.response.data.message)
    return Promise.reject(error); // 返回响应错误信息
})

// 默认导出
export default request;